<?php
namespace app\controller;

use app\BaseController;
use think\facade\Request;
use think\facade\Db;
use think\Exception;
use think\facade\Filesystem;
use think\facade\Log;
use think\Event;
use app\event\AssetHistoriesEvent;

class InfoUpdateBill extends BaseController
{
    //获取所有信息修改单及其明细
    public function getAllInfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        $current_page = Request::param('current_page');
        $page_size = Request::param('page_size');

        // 获取搜索表单参数
        $seachform = Request::param('seachform', [], 'trim'); // 使用trim过滤空白字符，并设置默认值为空数组

        //批量检查参数是否存在
        if (is_array($seachform)) {
            $begindate = $seachform['startDate'] ?? null;//开始制单日期
            $enddate = $seachform['endDate'] ?? null;//结束制单日期
            $billnumber = $seachform['BillNumber'] ?? null;//信息修改单号
            $state = $seachform['state'] ?? null;//修改单状态状态
            $branchId=$seachform['InfoUpdateBill_branch_id'] ?? null;

        }

        // 构建查询条件
        $where = [];

        if ($begindate && $enddate) {
            // 设置开始日期的时分秒为00:00:00
            $startOfDay = date('Y-m-d 00:00:00', strtotime($begindate));
            // 设置结束日期的时分秒为23:59:59（或者你也可以选择结束日期的次日00:00:00来简化比较）
            $endOfDay = date('Y-m-d 23:59:59', strtotime($enddate));

            // 使用范围查询
            $where[] = ['InfoUpdateBill_creationtime', '>=', $startOfDay];
            $where[] = ['InfoUpdateBill_creationtime', '<=', $endOfDay];
        }
        if ($billnumber) {
            $where[] = ['InfoUpdateBill_BillNumber', 'like', '%' . $billnumber . '%'];

        }
        if ($companyId) {
            $where['InfoUpdateBill_company_id'] = $companyId;
        }
        if ($state) {
            $where['InfoUpdateBill_state'] = $state;
        }

        if ($branchId) {
            $where['InfoUpdateBill_branch_id'] = $branchId;
        }

        // 查询主表数据,按照PurchaseBill_creationtime时间字段排序
        $mainList = Db::table('vw_InfoUpdateBill')
            ->where($where)
            ->where('InfoUpdateBill_deleted', 0)
            ->order('InfoUpdateBill_creationtime', 'desc')//按时间降序排名
            ->page($current_page, $page_size)
            ->select()->toarray();

        foreach ($mainList as &$item) {
            // 查询对应的明细表数据
            $detailList = Db::table('vw_InfoUpdateBill_assets')
                ->where('InfoUpdateBill_id', $item['InfoUpdateBill_id'])
                ->select();

            // 将明细表数据附加到主表数据上
            $item['detail'] = $detailList;
        }
        unset($item); // 取消引用，避免后续对$item的修改影响到$mainList

        // 获取总记录数
        $totalCount = Db::table('vw_InfoUpdateBill')
            ->where($where)
            ->where('InfoUpdateBill_deleted', 0)
            ->order('InfoUpdateBill_creationtime', 'desc')//按时间降序排名
            ->count();

        // 返回JSON数据
        return json([
            'code' => 200, // 自定义状态码，0表示成功
            'msg' => '查询成功', // 自定义消息
            'data' => [
                'data' => $mainList, // 主表数组包含明细表数组
                'total' => $totalCount, // 总数量

            ]

        ]);

    }
    //根据id获取信息修改单详情
    public function getInfoUpdateBillById()
    {
         $InfoUpdateBill_id=Request::param('InfoUpdateBill_id');
         $InfoUpdateBill=Db::table('vw_InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->find();
         $InfoUpdateBill_assets=Db::table('vw_InfoUpdateBill_assets')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->select();

        $keysToRemove=['company_name','user_name','InfoUpdateBill_id','InfoUpdateBill_BillNumber','InfoUpdateBill_user_id','InfoUpdateBill_creationtime','InfoUpdateBill_state','InfoUpdateBill_quantity','InfoUpdateBill_remarks','InfoUpdateBill_company_id','InfoUpdateBill_deleted','InfoUpdateBill_customer_id','InfoUpdateBill_AssetTypes_id','InfoUpdateBill_department_id','InfoUpdateBill_supplier_id','InfoUpdateBill_location_id','InfoUpdateBill_branch_id'];


        //删除掉不需要的元素
        foreach ($keysToRemove as $key) {
            if (isset($InfoUpdateBill[$key])) {
                unset($InfoUpdateBill[$key]);
            }
        }
        $InfoUpdateBill=filterEmptyValues($InfoUpdateBill);

        // 创建一个新的数组来存储处理后的数据
        $newInfoUpdateBill = [];

         // 遍历原始数组
        foreach ($InfoUpdateBill as $key => $value) {
            // 检查键名是否以'InfoUpdateBill_'开头
            if (strpos($key, 'InfoUpdateBill_') === 0) {
                // 去除前缀并添加到新数组中
                $newKey = substr($key, 15); // 13是'InfoUpdateBill_'的长度
                $newInfoUpdateBill[$newKey] = $value;
            } else {
                // 如果没有前缀，直接复制到新数组中
                $newInfoUpdateBill[$key] = $value;
            }
        }
        $lable=[
            'AssetTypes_name'=>'资产类型',
            'PurchaseDate'=>'购买日期',
            'PurchasePrice'=>'购买价格',
            'SerialNumber'=>'序列号',
            'brand'=>'品牌',
            'customer_name'=>'使用人',
            'department_name'=>'责任部门',
            'branch_name'=>'区域',
            'location_name'=>'位置',
            'supplier_name'=>'供应商',
            'model'=>'规格',
            'name'=>'名称',
            'remark'=>'备注',
            'source'=>'来源',
            'unit'=>'单位',
        ];

        // 准备最终数据结构
        $finalData = [];
        $finalColumnsConfig = [
            [
                'name' => 'assets_code',
                'label' => '资产编码'
            ]
        ]; // 初始化列配置数组

// 构建列名与标签的映射关系，并确定哪些列有实际的修改
        foreach ($lable as $columnName => $label) {
            if ($columnName !== 'assets_code') {
                $originalValue = isset($InfoUpdateBill_assets[0][$columnName]) ? $InfoUpdateBill_assets[0][$columnName] : null;
                $newValue = isset($newInfoUpdateBill[$columnName]) ? $newInfoUpdateBill[$columnName] : null;

                if ($newValue !== null || array_key_exists($columnName, $newInfoUpdateBill)) {
                    // 确保此列为真正修改过的，或在$newInfoUpdateBill中存在（即使值为空）
                    $finalColumnsConfig[] = [
                        'name' => $columnName,
                        'label' => $label . '（修改前）'
                    ];
                    if ($newValue !== null || $newValue === '') { // 显式检查空字符串，确保有列
                        $finalColumnsConfig[] = [
                            'name' => $columnName . '_new',
                            'label' => $label . '（修改后）'
                        ];
                    }
                }
            }
        }

// 遍历所有资产，整合数据
        foreach ($InfoUpdateBill_assets as $asset) {
            $row = ['assets_code' => isset($asset['assets_code']) ? $asset['assets_code'] : 'N/A','assets_id'=>$asset['assets_id']];

            // 根据列配置填充数据行，考虑了$newInfoUpdateBill中存在但值为空的情况
            foreach ($finalColumnsConfig as $columnConfig) {
                $column = $columnConfig['name'];
                $baseColumnName = strstr($column, '_new', true) ?: $column;
                if (strpos($column, '_new') !== false) {
                    // 即使newValue为空也要显示
                    $row[$column] = isset($newInfoUpdateBill[$baseColumnName]) ? $newInfoUpdateBill[$baseColumnName] : '';
                } else {
                    $row[$column] = isset($asset[$baseColumnName]) ? $asset[$baseColumnName] : '';
                }
            }

            // 移除空值的逻辑调整，确保$newInfoUpdateBill中存在的列即使值为空也被保留
            $finalRow = [];
            foreach ($row as $key => $value) {
                if (in_array($key, array_column($finalColumnsConfig, 'name')) || ($key === 'assets_code') || ($key === 'assets_id')) {
                    $finalRow[$key] = $value;
                }
            }

            $finalData[] = $finalRow;
        }

// 返回给前端的数据结构
        return json([
            'code'=>200,
            'columns' => $finalColumnsConfig, // 列配置数组，包含有修改或存在的列及其标签
            'data' => $finalData,
        ]);



    }
    //新增信息修改单
    public function add_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        $InfoUpdateBill =filterEmptyValues(Request::param('InfoUpdateBill'));

        $assets = Request::param('assets');


        if(isset($InfoUpdateBill['InfoUpdateBill_customer_id']))
        {
            //查询传过来的资产是否是初始状态,如果不是则提示不能新增
            foreach ($assets as $asset){
                $findAsset=Db::table('vw_AssetInitialStatus')->where('assets_id',$asset['assets_id'])->where('Status','非初始状态')->value('assets_id');
                if($findAsset)
                {
                    return json([
                        'code' => 400,
                        'msg' => '存在已产生单据的资产,编码:'.$asset['assets_code'].',不能新增信息修改单',
                    ]);
                }
            }


        }
        //检查是否有使用人信息，如果有则检查使用人的id是否是-1
//        if(isset($InfoUpdateBill['InfoUpdateBill_customer_id'])){
//            if($InfoUpdateBill['InfoUpdateBill_customer_id']==-1){
//                $InfoUpdateBill['InfoUpdateBill_customer_id']=null;
//            }
//
//        }



        try {
            // 开启事务
            Db::startTrans();
            //生成领用单号
            $billnumber = generateOrderNumber($companyId,'XG','InfoUpdateBill');
//            //获取主表的领用单信息和明细表信息
//            $InfoUpdateBill =filterEmptyValues(Request::param('InfoUpdateBill'));
//            $assets = filterEmptyValues(Request::param('assets'));
            //找查资产是否已经被其他未审核单据占用
            foreach ($assets as $asset){
                $findId=Db::table('InfoUpdateBill_assets')->where('assets_id',$asset['assets_id'])->value('InfoUpdateBill_id');
                if ($findId)
                {
                    $findAsset=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$findId)->where('InfoUpdateBill_state','未审核')->value('InfoUpdateBill_BillNumber');
                    if($findAsset)
                    {
                        return json([
                            'code' => 201,
                            'msg' => '资产:'.$asset['assets_name'].' '.'编码:'.$asset['assets_code'].'已经被未审核领用单:'.$findAsset.'占用，请先处理此单据'
                        ]);
                    }

                }

            }



            $InfoUpdateBill['InfoUpdateBill_company_id'] = $companyId;
            $InfoUpdateBill['InfoUpdateBill_BillNumber'] = $billnumber;
            $InfoUpdateBill['InfoUpdateBill_state'] = '未审核';
            $InfoUpdateBill['InfoUpdateBill_quantity'] = count(Request::param('assets'));
            $InfoUpdateBill['InfoUpdateBill_user_id'] = $userId;



            $InfoUpdateBillId = Db::table('InfoUpdateBill')->insertGetId($InfoUpdateBill);


            if (!$InfoUpdateBillId) {
                throw new \Exception('添加领货单主记录失败');
            }

            // 遍历货品明细并添加记录
            foreach ($assets as $detail) {
                $DetailBill['InfoUpdateBill_id'] = $InfoUpdateBillId;
                $DetailBill['assets_id'] = $detail['assets_id'];
                $DetailBill['before_department_id'] = $detail['assets_department_id'];
                $DetailBill['before_location_id'] = $detail['assets_location_id'];
                $DetailBill['before_branch_id']=$detail['assets_branch_id'];
                $DetailBill['before_AssetTypes_id']=$detail['assets_AssetTypes_id'];
                $DetailBill['before_brand']= $detail['assets_brand'];
                $DetailBill['before_model']= $detail['assets_model'];
                $DetailBill['before_unit']=  $detail['assets_unit'];
                $DetailBill['before_source']=$detail['assets_source'];
                $DetailBill['before_PurchasePrice']=$detail['assets_PurchasePrice'];
                $DetailBill['before_PurchaseDate']=$detail['assets_PurchaseDate'];
                $DetailBill['before_supplier_id']=$detail['assets_supplier_id'];
                $DetailBill['before_remark']=$detail['assets_remark'];
                $DetailBill['before_SerialNumber']=$detail['assets_SerialNumber'];
                $DetailBill['before_customer_id']=$detail['assets_customer_id'];
                $DetailBill['before_name']=$detail['assets_name'];
                $DetailBill['before_status']=$detail['assets_status'];




                $result = Db::table('InfoUpdateBill_assets')->insert($DetailBill);
                if (!$result) {
                    throw new \Exception('添加信息修改单明细记录失败');
                }
            }

            // 提交事务
            Db::commit();

            // 添加成功，返回响应
            return json(['code' => '200', 'msg' => '信息修改单添加成功']);


        }catch (\Exception $e) {
            // 发生异常，回滚事务
            Db::rollback();

            // 返回错误信息
            return json(['code' => '402', 'msg' => $e->getMessage()]);


        }

    }
    //修改资产信息修改单
    public function update_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        $InfoUpdateBill_id=Request::param('InfoUpdateBill_id');
        $InfoUpdateBill=Request::param('InfoUpdateBill');

        //验证单据是否合法
        $findInfoUpdateBill=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->where('InfoUpdateBill_state','未审核')->find();
        if(!$findInfoUpdateBill)
        {
            return json([
                'code' => 201,
                'msg' => '信息修改单不存在或已审核，不能修改',
            ]);
        }
        // 遍历数组，将空字符串替换为null
        foreach ($InfoUpdateBill as $key => $value) {
            if ($value ==" " || $value == null || $value == "null" || $value == "undefined" || $value == "") {
                $InfoUpdateBill[$key] = null;
            }
        }

        //开启事务并更新数据
        try {
            // 开启事务
            Db::startTrans();
            //直接更新
            $result = Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->update($InfoUpdateBill);
            if (!$result) {
                throw new \Exception('修改信息修改单失败');
            }
            //返回结果
            Db::commit();
            return json(['code' => '200', 'msg' => '信息修改单修改成功']);
        }
        catch (\Exception $e) {
            // 发生异常，回滚事务
            Db::rollback();

            // 返回错误信息
            return json(['code' => '402', 'msg' => $e->getMessage()]);


        }


    }

    //作废资产信息修改单invalid
    public function invalid_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');
        //开启事务
        try {
            Db::startTrans();
            $InfoUpdateBill_id=Request::param('InfoUpdateBill_id');
            //验证
            $findInfoUpdateBill=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->where('InfoUpdateBill_state','未审核')->find();
            if(!$findInfoUpdateBill)
            {
                return json([
                    'code' => 201,
                    'msg' => '信息修改单不存在或已审核，不能作废',
                ]);
            }
            $result = Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->update(['InfoUpdateBill_state'=>'已作废']);
            if (!$result) {
                throw new \Exception('作废信息修改单失败');
            }
           //返回结果
            Db::commit();
            return json(['code' => '200', 'msg' => '信息修改单作废成功']);


        }
        catch (\Exception $e) {
            // 发生异常，回滚事务
            Db::rollback();

            // 返回错误信息
            return json(['code' => '402', 'msg' => $e->getMessage()]);


        }


    }
    //删除资产信息修改单
    public function delete_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;
        try {
            Db::startTrans();
            $InfoUpdateBill_id=Request::param('InfoUpdateBill_id');
            $findInfoUpdateBill=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->where('InfoUpdateBill_state','已作废')->find();
            if(!$findInfoUpdateBill)
            {
                return json([
                    'code' => 201,
                    'msg' => '信息修改单不存在或已审核，不能删除',
                ]);
            }
            $result = Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->delete();
            if (!$result) {
                throw new \Exception('删除信息修改单失败');
            }
            //删除对应的明细
            $result = Db::table('InfoUpdateBill_assets')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->delete();
            if (!$result) {
                throw new \Exception('删除信息修改单明细失败');
            }
            //返回结果
            Db::commit();
            return json(['code' => '200', 'msg' => '信息修改单删除成功']);


        }
        catch (\Exception $e) {
            // 发生异常，回滚事务
            Db::rollback();

            // 返回错误信息
            return json(['code' => '402', 'msg' => $e->getMessage()]);


        }


    }
    //审核资产信息修改单
    public function check_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        $InfoUpdateBill_id =Request::param('InfoUpdateBill_id');
        try {
            Db::startTrans();
            $findInfoUpdateBill=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->where('InfoUpdateBill_state','未审核')->find();
            if(!$findInfoUpdateBill)
            {
                return json([
                    'code' => 201,
                    'msg' => '信息修改单不存在或已审核，不能审核',
                ]);
            }
            //检查是否可以审核
            $InfoUpdateBill_assets=Db::table('InfoUpdateBill_assets')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->select()->toArray();
            foreach ($InfoUpdateBill_assets as $checkAssetItem){
                $Asset=Db::table('assets')->where('assets_id',$checkAssetItem['assets_id'])->find();
                if($Asset==null){
                    return json(['code' => 201, 'msg' => '此单据有资产已被删除，请作废单据后重新提单']);
                }
                //比较资产是否有改变，如果修改了则不能审核
                $compare=$this->compareArrays(filterEmptyValues($checkAssetItem),$Asset,'before_','assets_');
                if (!$compare) {
                   //返回结果
                    Db::rollback();
                    return json(['code' => 201, 'msg' => '此单据有资产信息修改，请修改后重新提单']);
                }
            }

            //直接审核单据
            $result = Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->update(['InfoUpdateBill_state'=>'已审核']);

            $InfoUpdateBill = filterEmptyValues(Db::table('InfoUpdateBill')->where('InfoUpdateBill_id', $InfoUpdateBill_id)->find());
            // 过滤空值，去除不需要更新的字段
            $InfoUpdateBill_updates = array_diff_key($InfoUpdateBill, array_flip(['InfoUpdateBill_id', 'InfoUpdateBill_state', 'InfoUpdateBill_creationtime','InfoUpdateBill_user_id','InfoUpdateBill_remarks','InfoUpdateBill_company_id','InfoUpdateBill_deleted','InfoUpdateBill_BillNumber','InfoUpdateBill_quantity']));


            // 获取需要更新的资产ID列表
            $InfoUpdateBill_assets_id = Db::table('InfoUpdateBill_assets')->where('InfoUpdateBill_id', $InfoUpdateBill_id)->column('assets_id');

            // 遍历资产，更新资产信息
            $updatedCount = 0;
            foreach ($InfoUpdateBill_assets_id as $assets_id) {
                $assets = Db::table('assets')->where('assets_id', $assets_id)->find();

                // 去除无需更新的字段，同时处理前缀，这里简化处理，假设所有更新字段均需加上前缀'assets_'（实际应根据字段匹配逻辑调整）
                $assetsToUpdate = [];
                foreach ($InfoUpdateBill_updates as $key => $value) {
                    $newKey = str_replace('InfoUpdateBill_', '', $key);
                    // 添加'assets_'前缀
                    $assetsToUpdate['assets_' . $newKey] = $value;
                }

                // 这里假设需要过滤掉assets表中不存在的字段，实际可能需要更复杂的逻辑来处理字段映射
                $assetsToUpdate = array_intersect_key($assetsToUpdate, $assets);
                //判断是否存在assets_customer_id字段
                if (isset($assetsToUpdate['assets_customer_id'])) {
                    // 如果存在，则判断是否为空，如果为空则删除该字段
                    if (empty($assetsToUpdate['assets_customer_id'])) {
                        unset($assetsToUpdate['assets_customer_id']);
                    }else{
                        //否则有使用人应该把资产状态改为在用
                        $assetsToUpdate['assets_status']='在用';
                    }
                }

//                var_dump($assetsToUpdate);


                // 更新资产信息
                $result = Db::table('assets')->where('assets_id', $assets_id)->update($assetsToUpdate);
                if ($result !== false) {
                    $updatedCount++;
                }
            }

//            return json(['code' => 200, 'msg' => "成功更新了 {$updatedCount} 条资产信息"]);

            //使用事件触发器
            event(new AssetHistoriesEvent($InfoUpdateBill_id, $InfoUpdateBill_assets, $userId, $companyId,'信息修改'));
            //返回結果
            Db::commit();
            return json(['code' => '200', 'msg' => '审核信息修改单成功']);


        }
        catch (\Exception $e) {
            // 发生异常，回滚事务
            Db::rollback();

            // 返回错误信息
            return json(['code' => '402', 'msg' => $e->getMessage()]);


        }




    }
    //反审核信息修改单
    public function uncheck_InfoUpdateBill()
    {
        $userRoot = $this->request->auth['data']->user->user_root;
        $userId = $this->request->auth['data']->user->user_id;


        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        $InfoUpdateBill_id =Request::param('InfoUpdateBill_id');
        //开启事务
        try {
            Db::startTrans();
            $findInfoUpdateBill=Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->where('InfoUpdateBill_state','已审核')->find();
            if(!$findInfoUpdateBill)
            {
                return json([
                    'code' => 201,
                    'msg' => '信息修改单不存在或状态不对，不能反审核',
                ]);
            }
            //先检查领用单状态
            $InfoUpdateBill = Db::table('InfoUpdateBill')
                ->where('InfoUpdateBill_id', $InfoUpdateBill_id)
                ->find();


            //判断是否能反审核
            $resultJson=uncheck_checkAssetBill($InfoUpdateBill_id,'InfoUpdateBill','信息修改');
            if($resultJson){
                return $resultJson;
            }
            //反审核信息修改单
            $updateResult = Db::table('InfoUpdateBill')->where('InfoUpdateBill_id',$InfoUpdateBill_id)->update(['InfoUpdateBill_state'=>'未审核']);
            // 查询InfoUpdateBill_assets表，获取所有需更新的资产数据
            $updateRecords = Db::table('InfoUpdateBill_assets')
                ->where('InfoUpdateBill_id', $InfoUpdateBill_id)
                ->select();

            if (empty($updateRecords)) {
                return json(['code' => 404, 'msg' => '未找到任何需要更新的记录']);
            }

            // 遍历每条记录，准备并执行更新操作
            $successCount = 0;
            $failedRecords = []; // 记录未能更新的资产ID
            foreach ($updateRecords as $record) {
                // 准备更新数据，去除before_前缀，只保留要更新的字段
                $updateFields = [];
                foreach ($record as $key => $value) {
                    if (strpos($key, 'before_') === 0) {
                        $baseFieldName = substr($key, 7); // 去除'before_'得到基本字段名
                        $newKey = 'assets_' . $baseFieldName; // 添加'assets_'前缀
                        // 确保新键名对应到assets表的字段名
                        if (!in_array($newKey, ['InfoUpdateBill_id', 'assets_id'])) { // 排除不需要的字段
                            $updateFields[$newKey] = $value;
                        }
                    }
                }

                // 执行更新操作
                $assetsId = $record['assets_id'];
                $result = Db::table('assets')
                    ->where('assets_id', $assetsId)
                    ->update($updateFields);

                if ($result !== false) {
                    $successCount++;
                } else {
                    $failedRecords[] = $assetsId;
                }
                //删除对应的历史记录
                $deleteResult = Db::table('AssetHistories')
                    ->where('AssetHistories_bill_id', $InfoUpdateBill_id)
                    ->where('AssetHistories_assets_id', $assetsId)
                    ->where('AssetHistories_type','信息修改')
                    ->delete();
            }

            // 构建返回结果
            $message = '';
            if ($successCount > 0) {
                $message .= "$successCount 条资产记录更新成功";
            }
            if (!empty($failedRecords)) {
                $message .= ($successCount > 0 ? ', 但' : '') . "以下资产ID的记录更新失败: " . implode(', ', $failedRecords);
            }
            Db::commit();

            return json(['code' => $successCount ? 200 : 500, 'msg' => $message]);


        }
        catch (\Exception $e) {
            Db::rollback();
            return json(['code' => '402', 'msg' => $e->getMessage()]);
        }



    }

    /**
     * 比较两个数组的元素是否相同。
     * 此函数用于比较两个数组，数组的键名可能带有前缀，这些前缀在比较前会被移除。
     * 如果两个数组在移除前缀后具有相同的键和值，则返回true；否则返回false。
     *
     * @param array $array1 第一个数组，其键名可能带有前缀。
     * @param array $array2 第二个数组，其键名可能带有前缀。
     * @param string $prefix1 第一个数组的键名前缀，默认为'assets_'。
     * @param string $prefix2 第二个数组的键名前缀，默认为'before_'。
     * @return bool 如果两个数组在移除前缀后相同，则返回true；否则返回false。
     */
    function compareArrays($array1, $array2, $prefix1 = 'assets_', $prefix2 = 'before_') {
        // 创建处理后的数组
        $trimmedArray1 = array_combine(
            array_map(function($key) use ($prefix1) { return ltrim($key, $prefix1); }, array_keys($array1)),
            $array1
        );
        $trimmedArray2 = array_combine(
            array_map(function($key) use ($prefix2) { return ltrim($key, $prefix2); }, array_keys($array2)),
            $array2
        );

        // 取两个数组的交集键名，只比较这些键
        $commonKeys = array_intersect_key($trimmedArray1, $trimmedArray2);

        // 遍历比较
        foreach ($commonKeys as $key => $value) {
            if ($trimmedArray1[$key] !== $trimmedArray2[$key]) {
                return false;
            }
        }

        return true;
    }





}